package com.googlecode.jerato.library.store;

import java.util.StringTokenizer;

import com.googlecode.jerato.library.Settings;
import com.googlecode.jerato.library.SystemException;
import com.googlecode.jerato.library.ValueUtility;

public class XmlStoreFunction extends StoreFunctionImpl{
//	public static final String KEY_RESULT_LIST = "__result_list";
//	public static final String KEY_RESULT_EXISTS = "__result_exists";
//	public static final String KEY_RESULT_FIRST = "__result_first";
//	public static final String KEY_RESULT_COUNT = "__result_count";
//	public static final String KEY_UPDATE_COUNT = "__update_count";
//	
//	protected String _defaultSql;
//	protected boolean _updateSql;
//	protected List _bindNameList = new ArrayList();

	protected void loadSettings(String dataName, Settings settings){
		_storeSql = settings.getString("DefaultSql");
		if(_storeSql == null || _storeSql.length() == 0){
			throw new SystemException("settings sql not found. dataName='" + dataName + "'");
		}
		_storeSql = _storeSql.trim();
		String sqlUpdate = settings.getString("DefaultSqlUpdate");
		_updateSql = ValueUtility.isTrue(sqlUpdate);
		if(settings.containsKey("DefaultSqlValues")){
			String values = settings.getString("DefaultSqlValues");
			StringTokenizer tokens = new StringTokenizer(values, ",");
			while(tokens.hasMoreElements()){
				String token = tokens.nextToken();
				token = token.trim();
				if(token.length() == 0){
					continue;
				}
				_bindNameList.add(token);
			}
		}
	}
	protected XmlStoreFunction(){
		Settings settings = new Settings(this.getClass());
		settings.load();
		loadSettings(this.getClass().getName(), settings);
//		_defaultSql = settings.getString("DefaultSql");
//		if(_defaultSql == null || _defaultSql.length() == 0){
//			throw new SystemException("settings sql not found.");
//		}
//		_defaultSql = _defaultSql.trim();
//		String sqlUpdate = settings.getString("DefaultSqlUpdate");
//		_updateSql = ValueUtility.isTrue(sqlUpdate);
	}

	public XmlStoreFunction(String dataName){
		if(dataName == null || dataName.length() == 0){
			throw new IllegalArgumentException();
		}
		Settings settings = new Settings(dataName);
		settings.load();
		loadSettings(dataName, settings);
		
	}

//	public void call(FunctionTransfer trans, FunctionInput input, FunctionOutput output){
//		if(!(input instanceof StoreInputImpl)){
//			throw new IllegalArgumentException("input type not 'DataInput'.");
//		}
//		if(!(input instanceof StoreOutputImpl)){
//			throw new IllegalArgumentException("output type not 'DataOutput'.");
//		}
//		call((StoreTransfer)trans, (StoreInputImpl)input, (StoreOutputImpl)output);
//	}
//
//	public void call(StoreTransfer trans, StoreInputImpl input, StoreOutputImpl output){
//		StoreTransactionImpl transaction = input.getTransaction();
//		if(transaction == null){
//			throw new SystemException("transaction not initialized.");
//		}
//
//		List bindNameList = input.getBindNameList();
//
//		if(!_updateSql){
//			List resultList = executeSelect(transaction.getConnection(), _defaultSql, bindNameList, input);
//			output.put(KEY_RESULT_LIST, resultList);
//			output.put(KEY_RESULT_EXISTS, (resultList.size() > 0? Boolean.TRUE: Boolean.FALSE));
//			output.put(KEY_RESULT_FIRST, (resultList.size() > 0? resultList.get(0): null));
//			output.put(KEY_RESULT_COUNT, new Integer(resultList.size()));
//		}
//		else{
//			int updateCount = executeUpdate(transaction.getConnection(), _defaultSql, _bindNameList, input);
//			output.put(KEY_UPDATE_COUNT, new Integer(updateCount));
//		}
//	}
//
//	protected boolean isUpdateSql(String sql){
//		if(sql == null){
//			return false;
//		}
//		if(sql.toUpperCase().startsWith("SELECT")){
//			return false;
//		}
//		return true;
//	}
//
//	protected List executeSelect(Connection conn, String sql, List bindNameList, Map bindValues){
//
//		PreparedStatement stmt = null;
//		ResultSet resSet = null;
//		try{
//			try{
//				stmt = conn.prepareStatement(sql);
//				
//				if(bindNameList != null && bindValues != null){
//					processStatement(stmt, bindNameList, bindValues);
//				}
//
//				resSet = stmt.executeQuery();
//				ArrayList vec = new ArrayList();
//				ResultSetMetaData meta = resSet.getMetaData();
//				final int count = meta.getColumnCount();
//
//				String[] colNameList = new String[count];
//				for(int loop = 0; loop < count; loop++){
//					colNameList[loop] = meta.getColumnName(loop + 1);
//				}
//
//				prepareResultSet(resSet, colNameList);
//
//				while(resSet.next()){
//					Map bean = new HashMap();
//					bean = processResultSet(bean, colNameList, count, resSet);
//					vec.add(bean);
//				}
//				return vec;
//			}
//			finally{
//				try{
//					if(resSet != null){
//						resSet.close();
//					}
//				}
//				finally{
//					if(stmt != null){
//						stmt.close();
//					}
//				}
//			}
//		}
//		catch(SQLException se){
//			throw new SystemException("query error", se);
//		}
//	}
//
//	protected int executeUpdate(Connection conn, String sql, List bindNameList, Map bindValues){
//
//		PreparedStatement stmt = null;
//		try{
//			try{
//				stmt = conn.prepareStatement(sql);
//				
//				if(bindNameList != null && bindValues != null){
//					processStatement(stmt, bindNameList, bindValues);
//				}
//
//				int updateaCount = stmt.executeUpdate();
//				return updateaCount;
//			}
//			finally{
//				if(stmt != null){
//					stmt.close();
//				}
//			}
//		}
//		catch(SQLException se){
//			throw new SystemException("query error", se);
//		}
//	}
//
//	protected void prepareResultSet(ResultSet resSet, String[] colNameList){
//		for (int i = 0; i < colNameList.length; i++) {
//			colNameList[i] = colNameList[i].toLowerCase();
//		}
//	}
//	protected void processStatement(PreparedStatement stmt, List bindNameList, Map bindValues)
//		throws SQLException{
//
//		for(int loop = 0; loop < bindNameList.size(); loop++){
//			String name = (String)bindNameList.get(loop);
//			stmt.setObject(loop + 1, bindValues.get(name));
//		}
//	}
//	protected Map processResultSet(Map bean, String[] colNameList, int colCount, ResultSet resSet)
//		throws SQLException{
//
//		for(int index = 0; index < colCount; index++){
//			bean.put(colNameList[index], resSet.getObject(index + 1));
//			bean.put(String.valueOf(index), resSet.getObject(index + 1));
//		}
//		return bean;
//	}
//
//	public static void main(String[] args) {
//		try{
//			SystemService.staticInitialize();
//			StoreTransactionImpl transaction = DataTransactionService.getInstance().createTransaction();
//			List list = DataService.getInstance().select(null, "com.googlecode.jerato.common.data.CurrentTimestampSelect", null);
//			Timestamp currentTimestamp = (Timestamp)((Map)(list.get(0))).get("0");
//			System.out.println("currentTimestamp=" + currentTimestamp);
//			HashMap map = new HashMap();
//
//			map.put("user_id", "102");
//			map.put("user_key", "USER0102");
//			map.put("password_hash", "passpass");
//			map.put("family_name", "abc");
//			map.put("given_name", "def");
//			map.put("nick_name", "nick");
//			map.put("mail_address", "mail@example.com");
//			map.put("create_timestamp", currentTimestamp);
//			map.put("update_timestamp", currentTimestamp);
//			map.put("update_comment", "hello");
//			int count = DataService.getInstance().update(null, "com.googlecode.jerato.common.data.UserInsert", map);
//			System.out.println("insertCount=" + count);
//			transaction.commit();
//		}
//		finally{
//			SystemService.staticFinalize();
//    	}
//	}

}
